package com.enfry.common.util.excel;

import java.io.InputStream;
import java.util.List;
import java.util.Map;

import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import com.monitorjbl.xlsx.StreamingReader;

public class XssfExcelParser extends ExcelParser {

	@Override
	public List[] parseExcel(Map context, InputStream is) throws Exception {
		Workbook wb = null;
		try{
			try {
				logger.info("=====================");
//				wb = new XSSFWorkbook(is);
				wb = StreamingReader.builder()
		                .rowCacheSize(100)  //缓存到内存中的行数，默认是10
		                .bufferSize(4096)  //读取资源时，缓存到内存的字节大小，默认是1024
		                .open(is);  //打开资源，必须，可以是InputStream或者是File，注意：只能打开XLSX格式的文件
			} catch (Exception e) {
				logger.info("=====================读取Excel出错");
				throw new Exception("读取Excel出错:" + e.getMessage(), e);
			}
			logger.info("=====================");
			// 判断实际读入的sheet的数目是否少于期望的sheet的数目
			int sheetSize = wb.getNumberOfSheets();
			int parserSize = sheetParsers.size();
			if (sheetSize < parserSize) {
				throw new Exception("Excel文件的表单数(" + sheetSize + ")少于期望的数目("
						+ parserSize + ")");
			}
	
			List[] result = new List[parserSize];
			for (int i = 0; i < parserSize; i++) {
				// 模板中有多个sheet，有些sheet不需要进行解析，所以要根据sheet名称获取需要sheet进行解析
				SheetParser parser = sheetParsers.get(i);
				result[i] = parser.parseSheet(context, wb.getSheetAt(i));
			}
			return result;
		}finally{
			 if(wb!=null){
	    		wb.close();
			 }
		}
	}
}
